import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {
        // 监听
        ServerSocket server = new ServerSocket(2000);
        // 一般初始化服务器端就是在本机上，如果是在复杂的局域网中，可以自己指定一个IP地址

        // 打印
        System.out.println("服务器准备就绪~");
        System.out.println("服务器端信息：" + server.getInetAddress() + "P：" + server.getLocalPort());

        // 等待客户端连接
        for (;;) {
            // 得到客户端
            Socket client = server.accept();
            // 客户端构建异步线程
            ClientHandler clientHandler = new ClientHandler(client);
            clientHandler.start();
        }


//        todo(client);
    }

    // 如果有多个客户端，需要异步连接客户端

    /**
     * 客户端消息处理
     */
    private static class ClientHandler extends Thread {
        private Socket socket;
        private boolean flag = true;

        ClientHandler(Socket socket) {
            this.socket = socket;
        }

        @Override
        public void run() {
            super.run();
            // 打印客户端信息
            System.out.println("客户端信息：" + socket.getInetAddress() + "P：" + socket.getPort());

            try {
                // 得到打印流，用于数据输出；服务器回送数据
                PrintStream socketOutput = new PrintStream(socket.getOutputStream());

                // 得到输入流，用于向客户端输入数据？；服务器接收客户端数据
                BufferedReader socketInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                do {
                    // 拿到一条数据
                    String str = socketInput.readLine();

                    if ("bye".equalsIgnoreCase(str)) {
                         flag = false;
                         // 回送bye
                        socketOutput.println("bye");
                    } else {
                        // 打印到屏幕上
                        System.out.println(str);
                        socketOutput.println("回送："+str.length());
                    }

                } while (flag);

                socketOutput.close();
                socketInput.close();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                // 连接关闭
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("客户端已退出：" + socket.getInetAddress() + "P：" + socket.getPort());

        }
    }
}
